package za.org.jcicada.genss.lifecycle.katcp;

import za.org.jcicada.comms.impl.KatcpSerializerStrategy;
import za.org.jcicada.comms.messages.CommsMessage;
import za.org.jcicada.genss.lifecycle.LogLevel;
import za.org.jcicada.genss.lifecycle.messages.HaltReply;
import za.org.jcicada.genss.lifecycle.messages.HaltRequest;
import za.org.jcicada.genss.lifecycle.messages.PingReply;
import za.org.jcicada.genss.lifecycle.messages.PingRequest;
import za.org.jcicada.genss.lifecycle.messages.RestartReply;
import za.org.jcicada.genss.lifecycle.messages.RestartRequest;
import za.org.jcicada.genss.lifecycle.messages.SetLogLevelReply;
import za.org.jcicada.genss.lifecycle.messages.SetLogLevelRequest;

public class LifecycleKatcpSerializer extends KatcpSerializerStrategy {

    public LifecycleKatcpSerializer() {
        super(new Marshal(), new Unmarshal());
    }
    
    public static class Marshal {
        public Object[] HaltReply(HaltReply msg) {
            return new Object[] { msg.getCode(), msg.getMessage(), msg.getSystemURN() };
        }
        
        public Object[] HaltRequest(HaltRequest msg) {
            return new Object[] { msg.getSystemURN() };
        }
        
        public Object[] RestartReply(RestartReply msg) {
            return new Object[] { msg.getCode(), msg.getMessage(), msg.getSystemURN() };
        }
    
        public Object[] RestartRequest(RestartRequest msg) {
            return new Object[] { msg.getSystemURN() };
        }
            
        public Object[] SetLogLevelReply(SetLogLevelReply msg) {
            return new Object[] { msg.getCode(), msg.getMessage(), msg.getSystemURN(), msg.getLevel() };
        }
    
        public Object[] SetLogLevelRequest(SetLogLevelRequest msg) {
            return new Object[] { msg.getSystemURN(), msg.getLevel() };
        }
        
        public Object[] PingRequest(PingRequest msg) {
        	return new Object[] { msg.getSystemURN() };
        }
        
        public Object[] PingReply(za.org.jcicada.genss.lifecycle.messages.PingReply msg) {
        	return new Object[] { msg.getCode(), msg.getMessage(), msg.getSystemURN() };
        }
        
    }
    
    public static class Unmarshal {
        
        public CommsMessage HaltReply(String[] args) {
            return new HaltReply(parseResult(args), parseSystemURN(args, 2));
        }
        
        public CommsMessage HaltRequest(String[] args) {
            return new HaltRequest(parseSystemURN(args, 0));
        }
        
        public CommsMessage RestartReply(String[] args) {
            return new RestartReply(parseResult(args), parseSystemURN(args, 2));
        }
    
        public CommsMessage RestartRequest(String[] args) {
            return new RestartRequest(parseSystemURN(args, 0));
        }
            
        public CommsMessage SetLogLevelReply(String[] args) {
            return new SetLogLevelReply(parseResult(args), parseSystemURN(args, 2), LogLevel.valueOf(args[3]));
        }
    
        public CommsMessage SetLogLevelRequest(String[] args) {
            return new SetLogLevelRequest(parseSystemURN(args, 0), LogLevel.valueOf(args[1]));
        }
        
        public CommsMessage PingRequest(String[] args) {
            return new PingRequest(parseSystemURN(args, 0));
        }
        
        public CommsMessage PingReply(String[] args) {
            return new PingReply(parseResult(args), parseSystemURN(args, 2));
        }
        
    }
    
}
